package cn.iocoder.yudao.module.datasource.core;

import lombok.extern.slf4j.Slf4j;

/**
 * 数据源上下文持有者
 * 基于ThreadLocal的数据源上下文管理，实现线程安全的数据源切换
 *
 * @author 芋道源码
 */
@Slf4j
public class DataSourceContextHolder {

    /**
     * 线程本地变量，存储当前线程的数据源标识
     */
    private static final ThreadLocal<String> DATASOURCE_HOLDER = new ThreadLocal<>();

    /**
     * 设置当前线程的数据源
     *
     * @param dataSourceKey 数据源标识
     */
    public static void setDataSource(String dataSourceKey) {
        if (dataSourceKey == null) {
            log.warn("尝试设置空的数据源标识");
            return;
        }
        
        DATASOURCE_HOLDER.set(dataSourceKey);
        log.debug("线程 {} 设置数据源: {}", Thread.currentThread().getName(), dataSourceKey);
    }

    /**
     * 获取当前线程的数据源标识
     *
     * @return 数据源标识，如果未设置则返回null
     */
    public static String getDataSource() {
        String dataSourceKey = DATASOURCE_HOLDER.get();
        log.debug("线程 {} 获取数据源: {}", Thread.currentThread().getName(), dataSourceKey);
        return dataSourceKey;
    }

    /**
     * 移除当前线程的数据源设置（回到默认数据源）
     */
    public static void removeDataSource() {
        String dataSourceKey = DATASOURCE_HOLDER.get();
        DATASOURCE_HOLDER.remove();
        log.debug("线程 {} 移除数据源: {}", Thread.currentThread().getName(), dataSourceKey);
    }

    /**
     * 清空当前线程的数据源设置（同removeDataSource）
     */
    public static void clear() {
        removeDataSource();
    }
}